package com.basic.common;
import java.util.Date;

import com.whalin.MemCached.MemCachedClient;
import com.whalin.MemCached.SockIOPool;
 
/**
* 使用memcached的缓存实用类.
* 
*
*/
public class MemCached
{
    // 创建全局的唯一实例
	private static MemCachedClient mcc = new MemCachedClient();
    
    private static MemCached memCached = new MemCached();
    
    private static String readServer(){
    	return "127.0.0.1:11211";
    }
    // 设置与缓存服务器的连接池
    static {
        // 服务器列表和其权重
        String[] servers = {readServer()};
        Integer[] weights = {3};

        // 获取socke连接池的实例对象
        SockIOPool pool = SockIOPool.getInstance();

        // 设置服务器信息
        pool.setServers( servers );
        pool.setWeights( weights );

        // 设置初始连接数、最小和最大连接数以及最大处理时间
        pool.setInitConn( 5 );
        pool.setMinConn( 5 );
        pool.setMaxConn( 250 );

        // 设置主线程的睡眠时间
        pool.setMaintSleep( 30 );

        // 设置TCP的参数，连接超时等
        pool.setNagle( false );
        pool.setSocketTO( 3000 );
        pool.setSocketConnectTO( 0 );

        // 初始化连接池
        pool.initialize();
 
    }
    
    /**
     * 保护型构造方法，不允许实例化！
     *
     */
    private MemCached()
    {
        
    }
    
    /**
     * 获取唯一实例.
     * @return
     */
    public static MemCached getInstance()
    {
        return memCached;
    }
    
    /**
     * 添加一个指定的值到缓存中. 永不过期
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key, Object value)
    {
        return mcc.set(key, value);
    }
    
    /**
     * 添加一个指定的值到缓存中.
     * @param key
     * @param value
     * @param expiry ： 从当前时间开始保留多长时间。单位:秒
     * @return
     */
    public boolean set(String key, Object value, int expiry)
    {
        return mcc.set(key, value, FuncDate.addSecond(null, expiry));
    }
  
    /**
     * 添加一个指定的值到缓存中.
     * @param key
     * @param value
     * @param expiry ： 指定过期时间
     * @return
     */
    public boolean set(String key, Object value, Date expiry)
    {
        return mcc.set(key, value, expiry);
    }
    /**
     * 根据指定的关键字获取对象. 如果该主键不存在时，返回空
     * @param key
     * @return
     */
    public Object get(String key)
    {
        return mcc.get(key);
    }
    
    public String getStr(String key){
    	Object o = this.get(key);
    	if(o == null){
    		return null;
    	}else{
    		return o.toString();
    	}
    }
    /**
     * 删除某个KEY
     * @param key
     */
    public boolean remove(String key){
    	return mcc.delete(key);
    }
    
    public static void main(String[] args) throws InterruptedException
    {
        MemCached cache = MemCached.getInstance();
        cache.set("hello", "234", 5*60);
        System.out.print("get value : " + cache.get("hello"));
    }
}
